package com.ruoyi.web.controller.admin.upload;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.OSSUtils;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/api/file")
@Api(tags = "文件上传接口")
public class FileUploadController {


    // 注入OSS工具类
    @Autowired
    private OSSUtils ossUtils;

    // 从配置文件读取允许的文件类型和最大大小
    private final long maxFileSizeMB = 10 * 1024 * 1024; // 单位：MB
    private final List<String> ALLOWED_FILE_TYPES = Arrays.asList("jpg", "jpeg", "png", "pdf");
    private final List<String> ALLOWED_MIME_TYPES = Arrays.asList(
            "image/jpg", "image/jpeg", "image/png", "application/pdf"
    );

    /**
     * 文件上传接口
     * @param file 上传的文件（必传）
     * @param folder 自定义存储文件夹（可选，为空则用OSS默认文件夹）
     * @return 上传结果（包含文件URL、文件Key等信息）
     */
    @PostMapping("/upload")
    public AjaxResult uploadFile(
            @NotNull(message = "上传文件不能为空") @RequestParam("file") MultipartFile file,
            @RequestParam(value = "folder", required = false) String folder) {

        try {
            // 1. 校验文件大小
            long fileSizeMB = file.getSize() / (1024 * 1024); // 转换为MB
            if (fileSizeMB > maxFileSizeMB) {
                return AjaxResult.error("文件大小超过限制，最大支持" + maxFileSizeMB + "MB");
            }

            // 2. 校验文件类型（双重校验：扩展名 + MIME类型，防止篡改扩展名绕过）
            String originalFilename = file.getOriginalFilename();
            String fileExtension = getFileExtension(originalFilename);
            String fileMimeType = file.getContentType();

            // 校验扩展名
            if (!ALLOWED_FILE_TYPES.contains(fileExtension.toLowerCase())) {
                return AjaxResult.error("不支持的文件类型，仅允许上传jpg/png/pdf格式");
            }
            // 校验MIME类型（部分浏览器可能返回jpeg，需兼容）
            if (!ALLOWED_MIME_TYPES.contains(fileMimeType.toLowerCase())) {
                return AjaxResult.error("文件类型不匹配，请上传合法的jpg/png/pdf文件");
            }

            // 3. 调用OSS工具类上传文件
            OSSUtils.OssFileInfo ossFileInfo = ossUtils.upload(file, folder);

            // 4. 返回成功结果（包含文件URL、Key等信息）
            return AjaxResult.success(ossFileInfo);

        } catch (OSSUtils.OssException e) {
            // 捕获OSS工具类自定义异常（如OSS连接失败、文件不存在等）
            return AjaxResult.error("文件上传失败：" + e.getMessage());
        } catch (Exception e) {
            // 捕获其他未知异常
            return AjaxResult.error("文件上传异常：" + e.getMessage());
        }
    }

    /**
     * 提取文件扩展名（如 "test.jpg" → "jpg"）
     */
    private String getFileExtension(String originalFilename) {
        if (originalFilename == null || !originalFilename.contains(".")) {
            return "";
        }
        return originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
    }

}
